home *** CD-ROM | disk | FTP | other *** search
- #include <A4Stuff.h>
- #include <Gestalt.h>
- #include <Patches.h>
- #include <Resources.h>
- #include <TextUtils.h>
- #include <Types.h>
-
- //============================================================================
-
- pascal
- OSErr
- (*gOldGestalt)
- (
- OSType selector:__D0,
- long * response:__A1
- ):__D0;
-
- //============================================================================
-
- static
- asm
- OSErr
- GestaltPatch
- (
- OSType selector:__D0,
- long * response:__A1
- ):__D0;
-
- static
- pascal
- OSErr
- myGestaltPatch
- (
- OSType selector,
- long * response
- );
-
- asm long SetUpA4(void);
-
- //============================================================================
-
- pascal
- OSErr
- myGestaltPatch
- (
- OSType selector,
- long * response
- )
- {
- OSErr err = -1;
- long oldA4 = SetCurrentA4();
-
- Debugger();
-
- SetA4(oldA4);
-
- return err;
- }
-
- //============================================================================
-
- static
- asm
- OSErr
- GestaltPatch
- (
- OSType selector:__D0,
- long * response:__A1
- ):__D0
- {
- move.l A0,-(SP) // Save registers
- move.l A1,-(SP) // Save registers
- move.l A2,-(SP) // Save registers
- move.l A4,-(SP) // Save registers
- move.l D0,-(SP) // Save registers
- move.l D1,-(SP) // Save registers
- move.l D2,-(SP) // Save registers
-
- clr.w -(SP) // Clear default result
- move.l D0,-(SP) // Push selector
- move.l A1,-(SP) // Push response
- jsr myGestaltPatch // Call something higher level
- move.w (SP)+,D0 // Pop result
- bne.s allDone // Did something; just return
-
- realGestalt:
-
- move.l (SP)+,A0 // Restore registers
- move.l (SP)+,A1 // Restore registers
- move.l (SP)+,A2 // Restore registers
- move.l (SP)+,A4 // Restore registers
- move.l (SP)+,D0 // Restore registers
- move.l (SP)+,D1 // Restore registers
- move.l (SP)+,D2 // Restore registers
- jmp gOldGestalt // Call real gestalt
-
- allDone:
-
- move.l (SP)+,A0 // Restore registers
- move.l (SP)+,A1 // Restore registers
- move.l (SP)+,A2 // Restore registers
- move.l (SP)+,A4 // Restore registers
- move.l (SP)+,D0 // Restore registers
- move.l (SP)+,D1 // Restore registers
- move.l (SP)+,D2 // Restore registers
-
- rts // Return
- }
-
- //============================================================================
-
- void main (void)
- {
- long oldA4 = SetCurrentA4();
-
- gOldGestalt =
- (pascal OSErr (*)(OSType selector:__D0, long* response:__A1):__D0)
- NGetTrapAddress(0xA1AD, kOSTrapType);
-
- NSetTrapAddress((UniversalProcPtr)GestaltPatch, 0xA1AD, kOSTrapType);
-
- DetachResource(GetResource('INIT', 0));
-
- SetA4(oldA4);
- }
-
- //============================================================================
-
-